//package com.chang.rentmall.controllers;
//
//import com.chang.rentmall.beans.MessageBean;
//import com.chang.rentmall.beans.PayBean;
//import com.chang.rentmall.beans.PaymentPo;
//import com.chang.rentmall.forms.PayForm;
//import com.chang.rentmall.utils.MessageUtil;
//import com.chang.rentmall.utils.PayCommonUtil;
//import com.chang.rentmall.utils.PayUtil;
//import com.chang.rentmall.utils.UUIDHexGenerator;
//import org.dom4j.Document;
//import org.dom4j.DocumentException;
//import org.dom4j.Element;
//import org.dom4j.Node;
//import org.dom4j.io.SAXReader;
//import org.json.JSONException;
//import org.json.JSONObject;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.web.bind.annotation.RequestBody;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RequestMethod;
//
//import javax.servlet.http.HttpServletRequest;
//import java.io.ByteArrayInputStream;
//import java.io.InputStream;
//import java.io.UnsupportedEncodingException;
//import java.text.SimpleDateFormat;
//import java.util.*;
//
//public class PayController {
//    private String body = "商品描述"; // 商品描述
//    @Value("${weixin.appId}")
//    private String appId;
//    @Value("${weixin.secret}")
//    private String secret;
//    @Value("${weixin.serverIp}")
//    private String ip;
//    @Value("${weixin.mch_id}")
//    private String mchId;
//    @Value("${weixin.paySecret}")
//    private String paySecret;
//
//    @RequestMapping(value = "pay", method = RequestMethod.POST)
//    public MessageBean pay(@RequestBody PayForm payForm, HttpServletRequest request) throws DocumentException, UnsupportedEncodingException, JSONException {
//        MessageBean messageBean = new MessageBean();
////        PayBean payBean = payForm.getForm();
//
//        body = new String(body.getBytes("UTF-8"), "ISO-8859-1");
//
//        String nonce_str = UUIDHexGenerator.generate(); // 随机字符串
//        String today = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
//        String out_trade_no = payBean.getOrderNumber(); // 商户订单号
//        String spbill_create_ip = request.getRemoteAddr(); // 终端IP
//        String notify_url = "http://www.weixin.qq.com/wxpay/pay.php"; // 通知地址
//        String trade_type = "JSAPI"; // 交易类型
//        String openid = payBean.getOpenid(); // 用户标识
//
//        PaymentPo paymentPo = new PaymentPo();
//        paymentPo.setAppid(appId);
//        paymentPo.setMch_id(mchId);
//        paymentPo.setNonce_str(nonce_str);
//        String newbody = new String(body.getBytes("ISO-8859-1"), "UTF-8");//以utf-8编码放入paymentPo，微信支付要求字符编码统一采用UTF-8字符编码
//        paymentPo.setBody(newbody);
//        paymentPo.setOut_trade_no(out_trade_no);
//        paymentPo.setTotal_fee(payBean.getPaymentFee() + "");
//        paymentPo.setSpbill_create_ip(spbill_create_ip);
//        paymentPo.setNotify_url(notify_url);
//        paymentPo.setTrade_type(trade_type);
//        paymentPo.setOpenid(openid);
//        paymentPo.setSign_type("MD5");
//
//        SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();
//        packageParams.put("appid", appId);
//        packageParams.put("mch_id", mchId);
//        packageParams.put("nonce_str", today);//时间戳
//        packageParams.put("body", newbody);//支付主体
//        packageParams.put("out_trade_no", out_trade_no);//编号
//        packageParams.put("total_fee", payBean.getPaymentFee()); //价格packageParams.put("spbill_create_ip", ip);//这里之前加了ip，但是总是获取sign失败，原因不明，之后就注释掉了
//        packageParams.put("notify_url", notify_url); //支付返回地址，不用纠结这个东西，我就是随便写了一个接口，内容什么都没有
//        packageParams.put("trade_type", "JSAPI");//这个api有，固定的
//        packageParams.put("openid", openid);//openid
//        packageParams.put("sign_type", "MD5");
//
//        //获取sign
//        String sign = PayCommonUtil.createSign("UTF-8", packageParams, paySecret); // 最后这个是自己设置的32位密钥
//        packageParams.put("sign", sign);
//        //转成XML
//        String requestXML = PayCommonUtil.getRequestXml(packageParams);
//        System.out.println("转成xml ---------");
//        System.out.println(requestXML);
//
//        // 把请求参数打包成数组
//        Map<String, String> sParaTemp = new HashMap();
//        sParaTemp.put("appid", paymentPo.getAppid());
//        sParaTemp.put("mch_id", paymentPo.getMch_id());
//        sParaTemp.put("nonce_str", paymentPo.getNonce_str());
//        sParaTemp.put("body", paymentPo.getBody());
//        sParaTemp.put("out_trade_no", paymentPo.getOut_trade_no());
//        sParaTemp.put("total_fee", paymentPo.getTotal_fee());
//        sParaTemp.put("spbill_create_ip", paymentPo.getSpbill_create_ip());
//        sParaTemp.put("notify_url", paymentPo.getNotify_url());
//        sParaTemp.put("trade_type", paymentPo.getTrade_type());
//        sParaTemp.put("openid", paymentPo.getOpenid());
////        sParaTemp.put("sign_type", "MD5");
//
//        // 除去数组中的空值和签名参数
//        Map sPara = PayUtil.paraFilter(sParaTemp);
//        String prestr = PayUtil.createLinkString(sPara); // 把数组所有元素，按照“参数=参数值”的模式用“&”字符拼接成字符串
//        String key = "&key=" + paySecret; // 商户支付密钥
//
//        //MD5运算生成签名
////        String mysign = PayUtil.sign(prestr, key, "utf-8").toUpperCase();
//        String mysign = PayUtil.sign("appid=wx43b4a325dfcf1409&device_info=1&mch_id=1498243132&nonce_str=s4refd6urtfh6u67utdry6&out_trade_no=14982431322018052116382472834531&spbill_create_ip=39.107.122.205&total_fee=10", key, "utf-8").toUpperCase();
//        paymentPo.setSign(mysign);
//        //打包要发送的xml
//        String respXml = MessageUtil.messageToXML(paymentPo);
//        // 打印respXml发现，得到的xml中有“__”不对，应该替换成“_”
//        respXml = respXml.replace("__", "_");
//        String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";//统一下单API接口链接
//        String param = respXml;
////        String result = SendRequestForUrl.sendRequest(url, param);//发起请求
//        System.out.println("==================== param =====================");
//        System.out.println(param);
//        System.out.println("==========================================");
//        String result = PayUtil.httpRequest(url, "POST", requestXML);
//        System.out.println("--------- 返回信息 ---------->");
//        System.out.println(result);
//        System.out.println("-----------------------");
//
//        // 将解析结果存储在HashMap中
//        Map<String, String> map = new HashMap();
//        InputStream in = new ByteArrayInputStream(result.getBytes());
//        // 读取输入流
//        SAXReader reader = new SAXReader();
//        Document document = reader.read(in);
//        // 得到xml根元素
//        Element root = document.getRootElement();
//        // 得到根元素的所有子节点
//        @SuppressWarnings("unchecked")
//        List elementList = root.elements();
//        for (Object element : elementList) {
//            map.put(((Node) element).getName(), ((Node) element).getText());
//        }
//        // 返回信息
//        String return_code = (String) map.get("return_code");//返回状态码
//        String return_msg = (String) map.get("return_msg");//返回信息
//        System.out.println("return_msg" + return_msg);
//        JSONObject JsonObject = new JSONObject();
//
//        if (return_code == "SUCCESS" || return_code.equals("SUCCESS")) {
//            // 业务结果
//            String prepay_id = (String) map.get("prepay_id");//返回的预付单信息
//            String nonceStr = UUIDHexGenerator.generate();
//            JsonObject.put("nonceStr", nonceStr);
//            JsonObject.put("package", "prepay_id=" + prepay_id);
//            Long seconds = System.currentTimeMillis() / 1000;
//            String timeStamp = String.valueOf(seconds).substring(0, 10); //截取前10位
//            JsonObject.put("timeStamp", timeStamp + "");
//            String stringSignTemp = "appId=" + appId + "&nonceStr=" + nonceStr + "&package=prepay_id=" + prepay_id + "&signType=MD5&timeStamp=" + timeStamp;
//            //再次签名
//            String paySign = PayUtil.sign(stringSignTemp, "&key=" + secret, "utf-8").toUpperCase();
//            JsonObject.put("paySign", paySign);
//        }
//        messageBean.setValues(200, "请求支付成功", JsonObject);
//        return messageBean;
//    }
//}